package operate.rw;

/**
 * <p>
 * 该类用于模拟信号量及其P,V操作 <br>
 * 使用方法如下：<br>
 * Semaphore mutex = new Semaphore(1);            //信号量的初值赋为1 <br>
 * mutex.p(); <br>
 * //临界区代码 <br>
 * mutex.v(); <br>
 * </p>
 * @author zxc
 */

public class Semaphore {
    private int semValue;

    public Semaphore(int semValue) {
        this.semValue = semValue;
    }

    // p操作，synchronized标记
    public synchronized void p() {
        semValue--;
        if (semValue < 0) {
            try {
                // 等待操作
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    // v操作，synchronized标记
    public synchronized void v() {
        semValue++;
        if (semValue <= 0) {
            // 唤醒操作
            this.notify();
        }
    }
}

